package analiseSintatica.Regras.Comandos;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.ErroSemantico;
import analiseSemantica.Tipos.TipoSemantico;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSintatica.AnalisadorSintatico;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.Regras.Expressoes.RegraExpressao;

import java.util.LinkedList;

/**
 *
 * @author Edney
 */
public class RegraWhile extends Regra {


    protected static Regra instancia;


    /**
     * Construtor privado necessario ao singleton
     */
    private RegraWhile(){

    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraWhile getInstance() {
        if (instancia == null) {
            instancia = new RegraWhile();
        }
        return (RegraWhile) instancia;

    }

    

    protected String estrutura = "while '(' <expressao> ')' <bloco>";

    public TiposSemanticos analisar(LinkedList<LinkToken> tokens) throws ErroSintaticoException {
        
    	tokens.removeFirst();
        reconheceLexema(tokens, "delimitador", "(", estrutura);
        
        TiposSemanticos tipoexpressao = RegraExpressao.getInstance().analisar(tokens);
        if(tipoexpressao != null){
	        TipoSemantico tipoexpr = tipoexpressao.removeTipos();
	        String tipoexp = (String)tipoexpr.getTipo();
	        if(!tipoexp.toLowerCase().equals("boolean")){
	        	AnalisadorSintatico.errosemanticos.add(new ErroSemantico("Expressao deve ter valor booleano", tipoexpr.getLinha()));
	        }
        }
        reconheceLexema(tokens, "delimitador", ")", estrutura);
        TiposSemanticos tipos = RegraBloco.getInstance().analisar(tokens);
        return tipos;
    }

    protected void setPrimeiro() {
    	this.primeiro.add("while");
    }
}
